package com.wenx.v3system.modular.cloud.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wenx.v3system.modular.cloud.domain.dto.SysRoleDto;
import com.wenx.v3system.modular.cloud.domain.dto.SysUserDto;
import com.wenx.v3system.modular.cloud.domain.po.SysUserRole;

import java.util.List;
import java.util.Set;

/**
 * 系统用户角色关联服务接口
 * 基于Enhanced RBAC权限模型
 * 提供用户角色关联管理、权限继承和动态授权操作
 * 
 * @author wenx
 * @since 1.0.0
 */
public interface SysUserRoleService extends IService<SysUserRole> {

    /**
     * 根据用户ID获取角色ID列表
     *
     * @param userId 用户ID
     * @return 角色ID列表
     */
    List<Long> getRoleIdsByUserId(Long userId);

    /**
     * 根据用户ID获取角色详情列表
     *
     * @param userId 用户ID
     * @return 角色详情列表
     */
    List<SysRoleDto> getRolesByUserId(Long userId);

    /**
     * 根据角色ID获取用户ID列表
     *
     * @param roleId 角色ID
     * @return 用户ID列表
     */
    List<Long> getUserIdsByRoleId(Long roleId);

    /**
     * 根据角色ID获取用户详情列表
     *
     * @param roleId 角色ID
     * @return 用户详情列表
     */
    List<SysUserDto> getUsersByRoleId(Long roleId);

    /**
     * 为用户分配角色
     *
     * @param userId  用户ID
     * @param roleIds 角色ID列表
     */
    void assignRolesToUser(Long userId, List<Long> roleIds);

    /**
     * 为用户分配单个角色
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     */
    void assignRoleToUser(Long userId, Long roleId);

    /**
     * 移除用户的指定角色
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     */
    void removeUserRole(Long userId, Long roleId);

    /**
     * 移除用户的所有角色
     *
     * @param userId 用户ID
     */
    void removeUserRoles(Long userId);

    /**
     * 移除角色的所有用户关联
     *
     * @param roleId 角色ID
     */
    void removeRoleUsers(Long roleId);

    /**
     * 检查用户是否拥有指定角色
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 是否拥有角色
     */
    boolean hasRole(Long userId, Long roleId);

    /**
     * 检查用户是否拥有指定角色编码
     *
     * @param userId   用户ID
     * @param roleCode 角色编码
     * @return 是否拥有角色
     */
    boolean hasRoleByCode(Long userId, String roleCode);

    /**
     * 检查用户是否拥有任意一个角色
     *
     * @param userId  用户ID
     * @param roleIds 角色ID列表
     * @return 是否拥有任意角色
     */
    boolean hasAnyRole(Long userId, List<Long> roleIds);

    /**
     * 检查用户是否拥有所有角色
     *
     * @param userId  用户ID
     * @param roleIds 角色ID列表
     * @return 是否拥有所有角色
     */
    boolean hasAllRoles(Long userId, List<Long> roleIds);

    /**
     * 批量为用户分配角色
     *
     * @param userIds 用户ID列表
     * @param roleId  角色ID
     */
    void batchAssignRoleToUsers(List<Long> userIds, Long roleId);

    /**
     * 批量移除用户角色
     *
     * @param userIds 用户ID列表
     * @param roleId  角色ID
     */
    void batchRemoveUserRole(List<Long> userIds, Long roleId);

    /**
     * 获取用户的有效角色（排除禁用的角色）
     *
     * @param userId 用户ID
     * @return 有效角色列表
     */
    List<SysRoleDto> getActiveRolesByUserId(Long userId);

    /**
     * 获取用户角色的权限编码集合
     *
     * @param userId 用户ID
     * @return 权限编码集合
     */
    Set<String> getUserRolePermissions(Long userId);

    /**
     * 同步用户角色关联（先清除再添加）
     *
     * @param userId  用户ID
     * @param roleIds 新的角色ID列表
     */
    void syncUserRoles(Long userId, List<Long> roleIds);

    /**
     * 获取角色下的用户数量
     *
     * @param roleId 角色ID
     * @return 用户数量
     */
    long countUsersByRoleId(Long roleId);

    /**
     * 获取用户的角色数量
     *
     * @param userId 用户ID
     * @return 角色数量
     */
    long countRolesByUserId(Long userId);
}